/**
 * @file LineaReceta.java
 * @brief Entidad que representa una linea de receta que el medico prescribe al paciente
 *
 * Copyright (C)  - April [2011]
 *
 * @author Francisco Manuel Herrero Pérez
 * @version 01.00
 *
 * @footnote e-mail:  fran.herrero.perez    at gmail.com
 */

package GestorCitas;

import Definiciones.Definiciones;
import GestorFarmacia.*;
import GestorFarmacia.Entrega;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;


/**
 * @class LineaReceta
 * @brief Representa las lineas de receta.
 */
public class LineaReceta {

    /* Declaración de las variables de instancia */

    /**
     * @brief Codigo de identificacion de la linea
     */
    private int _id_linea;
    /**
     * @brief Observaciones del medico a tener en cuenta para la toma
     * de este medicamento
     */
    private String _observaciones;
    /**
     * @brief Periodo de tiempo entre cada dosis
     */
    private float _cada;
    /**
     * @brief Unidad de tiempo entre cada toma
     */
    private Definiciones.UnidadTiempo _tiempo_cada;
    /**
     * @brief Fecha de comienzo del tratamiento
     */
    private Date _fecha_inicio;
    /**
     * @brief Tramiento cancelado o no
     */
    private boolean _esta_cancelada;
    /**
     * @brief Numero de dosis a tomar en el tratamiento
     */
    private int _num_tomas; 

    /*Variables para las relaciones con otras clases*/

    /**
     * @brief Receta de la que forma parte esta lineaReceta
     */
    private int _id_receta; //
    /**
     * @brief 
     */
    private int _id_medicamento;
    /**
     * @brief  Entregas asociadas al medicamento de la lineaReceta
     */
    private int[] _id_entregas;

    /* Métodos de clase */

    public static void add ( LineaReceta lr ) throws SQLException, IOException, ClassNotFoundException {
        LineaRecetaDAO.add(lr);
    }
    public static void delete ( LineaReceta lr ) throws SQLException, IOException, ClassNotFoundException {
        LineaRecetaDAO.delete(lr);
    }
    public static void update ( LineaReceta lr ) throws SQLException, IOException, ClassNotFoundException {
        LineaRecetaDAO.update(lr);
    }
    public static LineaReceta get ( int id_linea ) throws SQLException, IOException, ClassNotFoundException {
        return LineaRecetaDAO.get(id_linea);
    }
    public static LineaReceta[] get (Integer id_receta, Integer id_medicamento, Date fecha_inicio, String observaciones, Float cada, Definiciones.UnidadTiempo tiempo_cada, Boolean esta_cancelada, Integer num_tomas) throws SQLException, IOException, ClassNotFoundException {
        return LineaRecetaDAO.get(id_receta, id_medicamento, fecha_inicio, observaciones, cada, tiempo_cada, esta_cancelada, num_tomas );
    }

    /*Métodos de instancia*/

    /**
     * @brief Contructor con parametros de LineaReceta
     * @param id_linea Codigo de identificacion de la linea
     * @param observaciones Observaciones del medico a tener en cuenta para la toma
     * de este medicamento
     * @param cada Periodo de tiempo entre cada dosis
     * @param tiempo_cada Unidad de tiempo entre cada toma
     * @param fecha_inicio Fecha de comienzo del tratamiento
     * @param esta_cancelada Tramiento cancelado o no
     * @param num_tomas Numero de dosis a tomar en el tratamiento
     * @param id_medicamento Codigo del medicamento recetado en esta lineaReceta
     * @param id_receta Codigo de la receta de la que forma parte esta lineaReceta
     */
    public LineaReceta(int id_linea, String observaciones, float cada, Definiciones.UnidadTiempo tiempo_cada, Date fecha_inicio,
                        boolean esta_cancelada, int num_tomas, int id_medicamento, int id_receta ) {
        this._id_linea = id_linea;
        this._observaciones = observaciones;
        this._id_receta = id_receta;
        this._id_medicamento = id_medicamento;
        this._cada = cada;
        this._tiempo_cada = tiempo_cada;
        this._fecha_inicio = fecha_inicio;
        this._esta_cancelada = esta_cancelada;
        this._num_tomas = num_tomas;
    }
    /**
     * @brief Devuelve el codigo de identificacion de la linea
     * @return Codigo de identificacion de la linea
     */
    public int getIdLinea() {
        return this._id_linea;
    }
    /**
     * @brief Devuelve las observaciones del medico a tener en cuenta para la toma
     * de este medicamento
     * @param id_linea Observaciones del medico a tener en cuenta para la toma
     * de este medicamento
     */
    public void setIdLinea(int id_linea) {
        this._id_linea = id_linea;
    }
    /**
     * @brief Devuelve el codigo de la receta de la que forma parte esta lineaReceta
     * @return Codigo de la receta de la que forma parte esta lineaReceta
     */
    public int getIdReceta() {
        return this._id_receta;
    }
    /**
     * @brief Asigna un codigo de receta de la que forma parte esta lineaReceta
     * @param id_receta Codigo de la receta a asignars
     */
    public void setIdReceta(int id_receta) {
        this._id_receta = id_receta;
    }
    /**
     * Devuelve el codigo del medicamento recetado en esta lineaReceta
     * @return Codigo del medicamento recetado en esta lineaReceta
     */
    public int getIdMedicamento() {
        return this._id_medicamento;
    }
    /**
     * @brief Asigna el codigo del medicamento recetado en esta lineaReceta
     * @param id_medicamento Codigo del medicamento a asignar
     */
    public void setIdMedicamento(int id_medicamento) {
        this._id_medicamento = id_medicamento;
    }
    /**
     * @brief Devuelve las observaciones del medico a tener en cuenta para la toma
     * de este medicamento
     * @return Observaciones del medico a tener en cuenta para la toma
     * de este medicamento
     */
    public String getObservaciones() {
        return this._observaciones;
    }
    /**
     * @brief Asigna las observaciones del medico a tener en cuenta para la toma
     * de este medicamento
     * @param observaciones Observaciones a asignar
     */
    public void setObservaciones(String observaciones) {
        this._observaciones = observaciones;
    }
    /**
     * @brief Devuelve el periodo de tiempo entre cada dosis
     * @return Periodo de tiempo entre cada dosis
     */
    public float getCada() {
        return this._cada;
    }
    /**
     * @brief Asigna el periodo de tiempo entre cada dosis
     * @param cada Periodo de tiempo entre cada dosis a asignar
     */
    public void setCada(float cada) {
        this._cada = cada;
    }
    /**
     * @brief Devuelve la unidad de tiempo entre cada toma
     * @return Unidad de tiempo entre cada toma
     */
    public Definiciones.UnidadTiempo getTiempoCada() {
        return this._tiempo_cada;
    }
    /**
     * @brief Asigna la unidad de tiempo entre cada toma
     * @param tiempo_cada Unidad de tiempo entre cada toma
     */
    public void setTiempoCada(Definiciones.UnidadTiempo tiempo_cada) {
        this._tiempo_cada = tiempo_cada;
    }
    /**
     * @brief Devuelve la fecha de comienzo del tratamiento
     * @return Fecha de comienzo del tratamiento
     */
    public Date getFechaInicio() {
        return this._fecha_inicio;
    }
    /**
     * @brief Asigna una fecha de comienzo del tratamiento
     * @param fecha_inicio Fecha de comienzo del tratamiento a asignar
     */
    public void setFechaInicio(Date fecha_inicio) {
        this._fecha_inicio = fecha_inicio;
    }
    /**
     * @brief Devuelve el numero de dosis a tomar en el tratamiento
     * @return Numero de dosis a tomar en el tratamiento
     */
    public int getNumTomas() {
        return this._num_tomas;
    }
    /**
     * @brief Asigna un numero de dosis a tomar en el tratamiento
     * @param num_tomas Numero de dosis a tomar en el tratamiento
     */
    public void setNumTomas(int num_tomas) {
        this._num_tomas = num_tomas;
    }
    /**
     * @brief Devuelve si el tramiento cancelado o no
     * @return Tramiento cancelado o no
     */
    public boolean getEstaCancelada() {
        return this._esta_cancelada;
    }
    /**
     * @brief Cancela el tratamiento y las entregas asociadas a ese tratamiento
     */
    public void cancelar() throws SQLException, IOException, ClassNotFoundException {
        this._esta_cancelada = true;
        for(int i = 0; i < this._id_entregas.length; i++) {
            EntregaDAO.delete(EntregaDAO.get(this._id_entregas[i]));
        }
    }
    /**
     * @brief Devuelve una instancia de Receta a la que pertenece la lineaReceta
     * @return Receta asociada a la linea de la receta
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public Receta getReceta() throws SQLException, IOException, ClassNotFoundException {
        return RecetaDAO.get(this._id_receta);
    }
    /**
     * @brief Devuelve una instancia de Cita en la que se hizo la receta a la que pertenece la lineaReceta
     * @return Cita asociada a la linea de la receta
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public Cita getCita() throws SQLException, IOException, ClassNotFoundException {
        Receta receta = getReceta();
        return CitaDAO.get(receta.getIdCita());
    }
    /**
     * @brief Devuelve una instancia de Medicamento que se receta en la lineaReceta
     * @return Medicamento asociado a la linea de la receta
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public Medicamento getMedicamento() throws SQLException, IOException, ClassNotFoundException {
        return MedicamentoDAO.get(this._id_medicamento);
    }
    /**
     * @brief Devuelve las entregas asociadas a esta LineaReceta
     * @return Vector con los codigos de las entregas asociadas a LineaReceta
     */
    public int[] getIdEntregas() {
        return this._id_entregas;
    }
    /**
     * @brief Asigna nuevas entregas a lineaReceta
     * @param id_entregas vector con los codigos de las nuevas entregas
     */
    public void setIdEntregas(int[] id_entregas) {
        this._id_entregas = id_entregas;
    }
    /**
     * @brief Devuelve las intancias Entrega asociadas a esta lineaReceta
     * @return Vector de entregas asociadas a esta lineaReceta
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public Entrega[] getEntregas() throws SQLException, IOException, ClassNotFoundException{
        ArrayList<Entrega> entregas = new ArrayList<Entrega>();
        Entrega [] salida = null;
        
        for(int i = 0; i < this._id_entregas.length; i++) 
            entregas.add(EntregaDAO.get(this._id_entregas[i]));

        if(entregas.size() > 0) {
            salida = new Entrega[entregas.size()];
            entregas.toArray(salida);
        }

        return salida;
    }



}
